#include <iostream>
#include <omp.h>  // OpenMP头文件

// collapse示例函数（3.8节示例）
void collapse_example() {
    const int n = 3;
    int i, j;  // 外层和内层循环变量
    
    /* 使用collapse合并双重循环
     * collapse(2)：将i和j循环合并为单一迭代空间
     * ordered：保证输出顺序与串行执行一致 */
    #pragma omp parallel for collapse(2) ordered
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            /* ordered指令：确保每次迭代按顺序执行
             * 尽管循环并行执行，但输出顺序与串行一致 */
            #pragma omp ordered
            std::cout << "Thread " << omp_get_thread_num() 
                      << ": (" << i << "," << j << ")\n";
        }
    }
}

int main() {
    // 设置最大线程数为4（实际线程数可能更少）
    omp_set_num_threads(4);
    
    // 执行collapse示例
    collapse_example();
    
    return 0;
}

/* 预期输出（顺序与串行执行相同，但线程分配可能不同）：
Thread X: (0,0)
Thread Y: (0,1)
Thread Z: (0,2)
Thread ... */

// g++ -fopenmp collapse_clause.cpp -o collapse_demo 
// ./collapse_demo  # 展示双循环合并和有序输出  